package com.secsys.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @className Service
 * @Description 业务逻辑接口
 * @author LiuQ
 * @date 2011-3-28 2:25
 * @param <T>
 *            领域对象
 * @param <PK>
 *            主键类型
 */

public interface Service<T, PK extends Serializable> {
	/**
	 * @Description 增加或修改对象
	 * @param entity
	 * @return
	 */
	public void saveOrUpdate(T entity);

	/**
	 * @Description 保存对象
	 * @param entity
	 * @return
	 */
	public void save(T entity);

	/**
	 * @Description 分页查询
	 * @param offset
	 * @param limit
	 * @param orderId
	 * @return
	 */
	/**public List<T> findList(int offset, int limit, String orderId);**/

	/**
	 * @Description 检索所有数据
	 * @return List
	 */
	public List<T> findAllList();

	/**
	 * @Description 按主键检索记录
	 * @param id
	 * @return T
	 */
	public T findById(PK id);

	/**
	 * @Description 按主键删除记录
	 * @param id
	 */
	public void deleteById(PK id);

	/**
	 * @Description 分页查询
	 * @param startSize
	 * @param pageSize
	 * @return
	 */
	public List<T> listPage(int startSize, int pageSize);

	/**
	 * @Description 统计记录
	 * @return
	 */
	public Integer count();

	/**
	 * @Description 根据HQL语句统计记录
	 * @param hql
	 * @return
	 */
	public Integer count(String hql);

	/**
	 * @Description 记录统计带日期参数
	 * @param queryHql
	 * @param map
	 *            -日期参数键值对
	 * @return
	 */
	public Integer count(String queryHql, Map<String, Date> map);

	/**
	 * @Description 删除实体
	 * @param entity
	 */
	public void delete(T entity);

	/**
	 * @Description 增加修改记录
	 * @param Object
	 *            obj
	 * @return Object
	 */
	public Object saveObjectReturn(Object obj);

	/**
	 * @Description 根据主键获取实体。如果没有相应的实体，抛出异常。
	 * @param PK
	 *            id
	 * @return t
	 */
	public T load(PK id);

	/**
	 * @Description 删除集合中的全部实体
	 * @param Collection
	 *            <T> entities
	 * @return
	 */
	public void deleteAll(Collection<T> entities);

	/**
	 * @Description 根据对象获取全部实体
	 * @param Object
	 *            obj
	 * @return List<?>
	 */
	@SuppressWarnings("unchecked")
	public List<?> getObject(Class clazz);

	/**
	 * 记录是否存在
	 * 
	 * @param property
	 * @param value
	 * @return
	 */
	/**public boolean isExist(String property, Long value);**/

	/**
	 * 记录是否存在
	 * 
	 * @param property
	 * @param value
	 * @return
	 */
	/**public boolean isExist(String property, String value);**/

	/**
	 * 提交数据并清空缓存
	 */
	public void flush();

	/**
	 * 清空缓存
	 */
	public void clear();

	/**
	 * 记录查询,使用HSQL语句检索数据
	 * 
	 * @param hql
	 *            -hql语句
	 * @return List<T>
	 * 			-查询的记录List
	 */
	public List<T> findByHql(String hql);
	
	/**
	 * 记录查询,使用带参数（多参数）的HSQL语句检索数据
	 * @param hql
	 * 		    -带参数的HSQL语句
	 * @param values
	 * 			-values参数数组
	 * @return List<T>
	 * 			-查询的记录List
	 */
	public List<T> find(String hql, Object[] values);
	
	/**
	 * 记录查询,使用带参数(单个属性对象)的HQL语句检索数据
	 * @param hql
	 * 			-hql带参数(单个属性对象)的HQL语句
	 * @param value
	 * 			-hql中的参数（单个属性对象）
	 * @return List<T>
	 * 			-查询的记录List
	 */
	public List<T> findByProperty(String hql, Object value);
    
	/**
	 * 分页查询
	 * 
	 * @param hql
	 *            -hql语句
	 * @param offset
	 *            -起始索引
	 * @param size
	 *            -显示条数
	 * @return
	 */
	public List<T> findByHql(String hql, int offset, int size);

	/**
	 * 分页查询
	 * 
	 * @param hql
	 *            -hql语句
	 * @param offset
	 *            -起始索引
	 * @param size
	 *            -显示条数
	 * @param map
	 *            -日期参数键值对
	 * @return
	 */
	public List<T> findByHql(String hql, int offset, int size,
			Map<String, Date> map);

}
